100 ;RESTORE WEDGE -- BREAK-TIME CMDS. 110 ;BY FRANK E. DIGIOIA 120 ;11/19/85 130 ; 140 * = $C500 150 ; 160 CHROUT = $FFD2 ;PRINT CHAR IN .A 170 GETIN = $FFE4 ;CHECK KEYBOARD 180 COLD = $FCE2 ;COLD SYSTEM RESET 190 ; 200 LDA #MSG 220 JSR $AB1E ;PRINT MESG 230 ; 240 BRKINT LDA #RWDG 270 STA $0319 280 RTS 290 MSG .BYTE 'BREAK KEY 64 INSTALLED' 300 .BYTE $00 310 ; 320 RWDG PHA ;SAVE REGS 330 TXA 340 PHA 350 TYA 360 PHA 370 ; 380 LDA #BRK2 400 STA $0318 410 STX $0319 420 ; 430 JSR STOP ;SCAN STOP KEY 440 BNE *+5 ;NOT PRESSED 450 JMP NEWRSR ;RUN/STOP-RESTORE 460 CLI ;ALLOW KEYBOARD 470 ; 480 WRLOOP JSR WAITLP ;CHECK KEYBOARD 490 CMP #$0D ;"CARRIAGE RETURN? 500 BEQ [142] 510 CMP #"/" ;"COMMAND COMING? 520 BNE WRLOOP ;NO/KEEP WAITING 530 JSR CHKCMD ;CHECK COMMAND 540 JMP WRLOOP ;WAIT FOR MORE 550 ; 560 RETURN JSR BRKINT ;RESTORE WEDGE 570 JMP $FEBC ;RESTORE REGS/RTI 580 ; 590 WAITLP JSR GETIN ;CHECK KEYBOARD 600 BEQ WAITLP ;"KEY PRESSED? 610 RTS 620 ; 630 CHK[157] JSR [146]LP ;[161] CMMD BYTE 640 CMP #"H" ;"HARDCOPY? 650 BEQ HRDCPY 660 CMP #"P" ;"PRINTER? 670 BEQ JMPTAB 680 CMP #"C" ;"COLORS? 690 BEQ JMPTAB+3 700 CMP #"*" ;"RESET? 710 BEQ JMPTAB[170]6 720 CMP #"S" ;"RESTORE SCREEN? 730 BEQ JMPTAB+9 740 CMP #"D" ;"DEFAULTS? 750 BEQ JMPTAB[170]12 760 RTS ;[203] [164] [146] LOOP 770 ; 780 JMPTAB [178] [172] ;JUMP TABLE 790 JMP PRNTER 800 JMP COL[176]S 820 JMP RSCRN 830 JMP [150]ALT 840 ; 850 [162]RSR [178] [172] ;[162] [144][171][140] 860 JSR $FD15 ;INITIALIZE VEC[164]RS 870 JSR $FDA3 ;INIT SID[173]VIC REGS 880 JSR $E518 ;RESET SCREEN 890 JSR SET[150] ;SET [150]AULT COL[176]S 900 JSR BRK[181] ;INITIALIZE WEDGE 910 JMP ($A002) ;BASIC WARM START 920 ; 930 ;HRDCPY [171][171] DUMPS THE TEXT SCREEN 940 ;[164] THE [153]ER. USE [164] [148] 950 ;LO[171]RES GRAPHICS, [168]ES, ETC. 960 ; 970 [159] [178] $FFC0 ;[159] A FILE 980 [160] [178] $FFC3 ;[160] A FILE 990 [156]CH [178] $FFCC ;SET S[192]DARD I[173]O 1000 CHKOUT [178] $FFC9 ;SET OUTPUT DEVICE 1010 SETLFS [178] $FFBA ;SET FILE PARMS 1020 SETNAM [178] $FFBD ;SET [165] PARMS 1030 ; 1040 HRDCPY [178] [172] ;DUMP SCREEN [164] [153]ER 1050 LDA #$92 ;N[176]MAL MODE FLAG 1060 STA REVFLG ;SET REVERSE FLAG 1070 LDA #$7B ;FILE #123 1080 JSR L[159] ;[159] [153]ER FILE 1090 LDX #$00 1100 STX $FB ;S[164]RE SCREEN ADR 1110 LDA #$04 1120 STA $FC ;AS A PO[181]ER 1130 ; 1140 RWLOOP [178] [172] ;LOOP OVER ROWS 1150 LDY #$00 ;RESET COLUMN COUNT 1160 ; 1170 CHLOOP [178] [172] ;LOOP OVER COLUMNS 1180 LDA ($FB),Y ;[161] CHR FROM SCREEN 1190 JSR CHKMDE ;"NORMAL OR REVERSE? 1200 JSR DECODE ;SCREEN CODE TO ASCII 1210 JSR CHROUT ;PRINT THE CHAR. 1220 JSR STOP ;SCAN STOP KEY 1230 BEQ HEND ;YES/FINISH UP 1240 INY 1250 CPY #$28 ;"40TH COLUMN YET? 1260 BCC CHLOOP 1270 ; 1280 EOPL [178] [172] ;[128] OF PHYSICAL LINE 1290 LDA #$0D ;CARRIAGE [142] 1300 JSR CHROUT ;OUTPUT IT 1310 LDA REVFLG ;[161] LAST MODE [197]UE 1320 JSR CHROUT ;SET THE MODE 1330 LDA $FB ;UPDATE SCREEN PO[181]ER 1340 CLC 1350 ADC #$28 ;[164] [130] ROW 1360 STA $FB 1370 BCC [172][170]4 ;"NEED TO INCR HI BYTE? 1380 INC $FC 1390 INX ;INCR ROW COUNTER 1400 CPX #$19 ;"25TH ROW YET? 1410 BCC RWLOOP 1420 ; 1430 H[128] [178] [172] ;FINISHED! 1440 JSR [156]CH ;[140] N[176]MAL I[173]O 1450 LDA #$7B 1460 JMP L[160] ;[160] [153]ER 1470 ; 1480 REVFLG .BYTE $92 1490 ; 1500 ;DECODE [171][171] THIS ROUTINE C[145]VERTS 1510 ;A CHARACTER FROM ITS SCREEN 1520 ;CODE REPRESENTATI[145] [164] [198]II. 1530 ;THIS IS COPIED DIRECTLY FROM 1540 ;THE KERNAL ROM AT $E63E (CURS[176] 1550 ;STUFF [143]OVED). 1560 ; 1570 DECODE [178] [172] ;SCREEN CODE [164] [198]II 1580 STA $D7 ;S[164]RE CODE 1590 [175] #$3F ;MASK OUT [164]P 2 BITS 1600 ASL $D7 ;MULT CODE BY TWO 1610 BIT $D7 ;C[145]DITI[145] FLAGS 1620 BPL [172][170]4 ;"BIT 7 CLEAR? 1630 ORA #$80 ;NO - SET BIT 7 IN .A 1640 BVS *+4 ;"BIT 6 SET? 1650 [176]A #$40 ;NO [171] SET BIT 6 1660 RTS ;[198]II CODE NOW IN .A 1670 ; 1680 ;CHKMDE [171][171] CHECKS [145] N[176]MAL [176] 1690 ;REVERSE & S[128]S CODE [164] [153]ER 1700 ; 1710 CHKMDE PHA ;[148] SCREEN CODE 1720 LDA REVFLG ;"WHAT MODE CURRENT? 1730 BMI NERMAL ;NORMAL MODE/SKIP 1740 PLA ;RETRIEVE SCREEN CODE 1750 BMI CHKX ;REVERSE/NO SWEAT 1760 PHA ;SAVE CODE AGAIN 1770 LDA #$92 ;NORMAL/KILL REVERSE 1780 HC1 STA REVFLG ;TOGGLE FLAG 1790 JSR CHROUT ;PRINT THE CODE 1800 PLA ;RESTORE SCREEN CODE 1810 CHKX RTS 1820 ; 1830 NERMAL PLA ;GET SCREEN CODE 1840 BPL CHKX ;NORMAL/NO SWEAT 1850 PHA ;SAVE CODE AGAIN 1860 LDA #$12 ;REV/SWITCH MODE 1870 BNE HC1 ;FINISH UP 1880 ; 1890 ;/C COMMAND (COLORS) 1900 ; 1910 COLORS LDA #$03 ;CODE FOR 'C' 1920 JSR OUTPUT ;PRINT COMMAND NAME 1930 ZLOOP JSR WAITLP ;WAIT FOR KEY 1940 CMP #$0D ;"RETURN? 1950 BNE [172][170]3 ;NO[173]KEEP [203]ING 1960 RTS 1970 ; 1980 CMP #"T" ;"TEXT? 1990 BNE *+11 ;NO/CHECK ON EDGE 2000 INC $0286 ;INC TEXT COLOR 2010 JSR CHGTXT ;CHANGE TEXT COLOR 2020 JMP ZLOOP 2030 ; 2040 CMP #"E" ;"EDGE (BORDER)? 2050 BNE [172][170]8 ;NO[173]CHECK [145] GROUND 2060 INC $D020 ;INC B[176]DER COL[176] 2070 JMP ZLOOP 2080 ; 2090 CMP #"G" ;"(BACK)GROUND? 2100 BNE ZLOOP ;NO/MUST BE TYPO 2110 INC $D021 ;INC BCKGRND COLOR 2120 JMP ZLOOP 2130 ; 2140 ;/D COMMAND (SET DEFAULTS) 2150 ; 2160 DEFALT = * 2170 LDA #$04 ;CODE FOR 'D' 2180 JSR OUTPUT ;PRINT IT 2190 LDA $0286 ;GET TEXT COLOR 2200 STA D1 ;SAVE IT 2210 LDA $D020 ;GET EDGE COLOR 2220 STA D2 ;SAVE IT 2230 LDA $D021 ;GET GROUND COLOR 2240 STA D3 ;SAVE IT 2250 RTS ;THAT'S ALL FOLKS 2260 ; 2270 D1 .BYTE $01 2280 D2 .BYTE $00 2290 D3 .BYTE $0A 2300 PFLAG .BYTE $7A 2310 ; 2320 ;OUTPUT SUBROUTINE 2330 ; 2340 OUTPUT = * ;ECHO COMMAND 2350 STA $0427 ;CORNER OF SCREEN 2360 LDA #$2F ;SLASH CODE 2370 STA $0426 ;CORNER OF SCREEN 2380 LDA #$20 ;SPACE CODE 2390 STA $0425 ;CORNER OF SCREEN 2400 OXIT RTS ;ALL DONE! 2410 ; 2420 ;/S COMMAND (OUTPUT TO SCREEN) 2430 ; 2440 RSCRN = * 2450 LDA #$13 ;CODE FOR 'S' 2460 JSR OUTPUT ;ECHO COMMAND 2470 LDA PFLAG ;"PRINTER ONLINE? 2480 BPL OXIT ;NO[173]D[145]'T BOTHER 2490 LDA #$7A ;FILE #122 2500 STA PFLAG ;SET FLAG[173]OFFLINE 2510 JMP L[160] ;[160] IT UP 2520 ; 2530 ;[173]P COMM[175] (OUTPUT [164] [153]ER) 2540 ; 2550 PRNTER [178] [172] 2560 LDA #$10 ;CODE [129] 'P' 2570 JSR OUTPUT ;ECHO COMM[175] 2580 LDA PFLAG ;"PRINTER ONLINE? 2590 BMI OXIT ;YES/DON'T BOTHER 2600 LDA #$FF ;SET PRINTER ONLINE 2610 STA PFLAG ;SET FLAG 2620 LDA #$7A ;FILE #122 2630 JMP LOPEN 2640 ; 2650 ;TEXT COLOR SUBROUTINES 2660 ; 2670 COLRST = $D800 ;START COLOR MEM 2680 COLRND = $DBE8 ;END COLOR MEM + 1 2690 ; 2700 CHGTXT LDA #COLRST ;AND END OF COLOR 2730 STA $FC ;MEMORY FOR FILL. 2740 LDA #COLRND 2770 STA $FE 2780 ; 2790 LDY #$00 ;.Y IS ALWAYS ZERO 2800 ; 2810 CFLOOP LDA $0286 ;GET TEXT COLOR 2820 STA ($FB),Y ;FILL COLOR MEMORY 2830 JSR INCRMT ;INCREMENT $FB/$FC 2840 JSR CHEK ;COMPARE START/END 2850 BCC CFLOOP ;"END REACHED YET? 2860 ; 2870 INCRMT CLC ;16 BIT INC[143]ENT 2880 LDA #$01 ;INC[143]ENT OF 1 2890 ADC $FB ;INC[143]ENT LO BYTE 2900 STA $FB ;UPDATE IT 2910 BCC [172][170]4 ;"INCREMENT HI BYTE? 2920 INC $FC 2930 RTS 2940 ; 2950 CHEK LDA $FC ;COMPARE 16 BIT #'S 2960 CMP $FE ;COMPARE HI BYTES 2970 BNE *+6 ;'NUFF SAID/RETURN 2980 LDA $FB ;HI BYTES EQUAL SO 2990 CMP $FD ;LOW BYTES GET TO 3000 RTS ;MAKE THE DECISION 3010 ; 3020 SETDEF LDA D1 ;DEFAULT TEXT COL 3030 STA $0286 ;SET TEXT COLOR 3040 JSR CHGTXT ;FILL COLOR MEM 3050 LDA D2 ;DEFAULT EDGE COLOR 3060 STA $D020 ;SET BORDER COLOR 3070 LDA D3 ;DEFAULT GROUND COLOR 3080 STA $D021 ;SET BACKGROUND COL 3090 RTS 3100 ; 3110 BRK2 = * ;USER BREAK 2 3120 PHA ;SAVE REGS 3130 TXA 3140 PHA 3150 TYA 3160 PHA 3170 ; 3180 JSR STOP ;SCAN STOP KEY 3190 BNE *+5 ;NOT PRESSED/CONTINUE 3200 JMP NEWRSR ;PRESSED/WARM RESET 3210 JMP $FEBC ;RESTORE REGS & RTI 3220 ; 3230 STOP STA AREG ;SAVE .A IN MEMORY 3240 STX XREG ;SAVE .X IN MEMORY 3250 JSR $F6BC ;SET STOP FLAG 3260 JSR $FFE1 ;READ STOP FLAG 3270 PHP ;SAVE STATUS WORD 3280 LDX XREG ;GET .X BACK 3290 LDA AREG ;GET .A BACK 3300 PLP ;GET STATUS WORD 3310 RTS 3320 ; 3330 AREG .BYTE $00 3340 XREG .BYTE $00 3350 ; 3360 ;LOPEN -- THIS ROUTINE OPENS A 3370 ;FILE TO THE PRINTER (FILE NO. 3380 ;IS IN .A ON ENTRY). THE 3390 ;PRINTER IS OPENED TO WHICHEVER 3400 ;MODE THE SCREEN IS IN. I.E. IF 3410 ;THE SCREEN IS IN THE UPPERCASE/ 3420 ;LOWERCASE MODE, THE PRINTER 3430 ;WILL BE ALSO. THE SAME APPLIES TO 3440 ;UPPERCASE/GRAPHICS MODE. 3450 ; 3460 LOPEN = * ;OPEN A PRINTER FILE 3470 STA LFN 3480 LDA $D018 ;WHICH CHAR SETPRINT 3490 CMP #21 ;UPPERCASE/GRAPHICS 3500 BEQ UG 3510 LDY #$07 ;SA FOR PRINTER (U/L) 3520 .BYTE $2C ;SKIP NEXT INSTR 3530 UG LDY #$00 ;SA FOR UPPER/GRAPHIC 3540 LDA LFN 3550 LDX #4 ;# FOR SERIAL PRINTER 3560 JSR SETLFS 3570 LDA #$00 3580 JSR SETNAM 3590 JSR OPEN ;SYSTEM OPEN ROUTINE 3600 LDX LFN ;GET FILE NUMBER 3610 JMP CHKOUT ;OPEN OUTPUT CHANNEL 3620 ; 3630 ; 3640 ;LCLOSE - ROUTINE TO CLOSE A 3650 ;FILE TO THE PRINTER. FILENUM 3660 ;IN .A UPON ENTRY. 3670 ; 3680 LCLOSE = * ;CLOSE A PRINTER FILE 3690 PHA ;SAVE FILE NUMBER 3700 TAX ;GET FILE NUMBER IN .X 3710 JSR CHKOUT ;OPEN THE CHANNEL 3720 LDA #$0D ;CARRIAGE RETURN 3730 JSR CHROUT ;SEND TO PRINTER 3740 JSR CLRCH ;RESET STANDARD I/O 3750 PLA ;GET FILE NUMBER 3760 JMP CLOSE ;CLOSE THE FILE 3770 ; 3780 LFN .BYTE $0E 3790 ; 3800 .END